/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package hilos;

import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JTextArea;

/**
 * Los procesos externos deben ser lanzados usando esta clase
 * @author Felipe Serrano
 */

public class HiloProceso extends HiloNessy{
    private String comando;
    private String salida;
    private JTextArea pestaña;
    private int retorno;
    private ArrayList<JButton> lstBotones;
    
    /**
     * Esta constructora no tiene botones que habilitar al terminar el proceso 
     * asociado.
     * @param nombre del hilo
     * @param pestaña por la que mostrará la salida del proceso asociado
     * @param comando a ejecutar
     * @param salida fichero donde volcar la salida
     */
    public HiloProceso(String nombre, JTextArea pestaña, String comando, String salida){
        setName(nombre);
        this.comando = comando;
        this.salida = salida;
        this.pestaña = pestaña;
    }

    /**
     * Constructora destinada a los procesos finales de cada "grupo", se le pasa
     * una lista de botones que habilitar en la interfaz una vez terminados.
     * @param nombre del hilo
     * @param pestaña por la que mostrará la salida del proceso asociado
     * @param comando a ejecutar
     * @param salida fichero donde volcar la salida
     * @param lstBotones botones de la GUI que habilitar una vez terminado
     */
    public HiloProceso(String nombre, JTextArea pestaña, String comando, String salida, ArrayList<JButton> lstBotones){
        setName(nombre);
        this.comando = comando;
        this.salida = salida;
        this.pestaña = pestaña;
        this.lstBotones = lstBotones;
    }

    public void run() {
        try {
            pestaña.append("*****************************************************\n");
            pestaña.append("Lanzando proceso: " + this.getName() + "\n");
            pestaña.append("\"" + comando + "\"\n\n");
            pestaña.setCaretPosition(pestaña.getText().length());
            Process proceso = Runtime.getRuntime().exec(comando);
            if (salida != null) {
                if (!getName().equals("Impact")) {
                    HiloMostrarSalida hilo = new HiloMostrarSalida(pestaña, proceso, salida);
                    hilo.setName("Salida " + Thread.currentThread().getName());
                    hilo.start();
                } else {
                    HiloSalidaStandarCargarBit hiloImpact = new HiloSalidaStandarCargarBit(pestaña, true, proceso);
                    hiloImpact.setName("Salida 1 de impact std");
                    hiloImpact.start();
                    HiloSalidaErrorCargarBit hiloImpact2 = new HiloSalidaErrorCargarBit(pestaña, true, proceso);
                    hiloImpact2.setName("Salida 2 de impact err");
                    hiloImpact2.start();
                    HiloSalidaStandarCargarBit hiloImpact3 = new HiloSalidaStandarCargarBit(pestaña, true, proceso);
                    hiloImpact3.setName("Salida 3 de impact std");
                    hiloImpact3.start();
                }
            }
            retorno = proceso.waitFor();
            tabla.put(getId(), retorno);
            if (retorno == 0) {
                pestaña.append("\n\nProceso finalizado: OK\n");
                if(lstBotones != null) {
                    for (int i = 0; i < lstBotones.size(); i++) {
                        lstBotones.get(i).setEnabled(true);
                    }
                }
            } else {
                pestaña.append("\n\nProceso finalizado: ERROR (" + retorno + ")\n");
            }
            pestaña.append("*****************************************************\n\n\n");
            pestaña.setCaretPosition(pestaña.getText().length());
        } catch (InterruptedException ex) {
            Logger.getLogger(HiloProceso.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(HiloProceso.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
